배경

개발을 하는 과정에서 이미지 파일을 변수로 받아야하는 상황이 생겼다. 나는 그래서 당연히 해당 사진의 경로를 변수로 저장해야 하니깐, String 타입으로 해당 데이터를 받을려고 다음과 같은 코드를 작성했다.

fun Circle(nickname: String, profile: String, profilename: String, modifier: Modifier = Modifier) {
 
    Image(
        painter = painterResource(id = profile),
        contentDescription = stringResource(id = profilename)
    )
    Text(
        text = "$nickname"
    )
}

하지만 해당 코드는 오류가 났고, 그 이유는 타입 문제였다.

R.drawable.xxx의 비밀

R.drawable.xxx는 Int 타입의 데이터이다.

그럼 어떻게 우리는 데이터는 String 타입으로 넣었는데, Int 로 변환돼서 나오는걸까?

public final class R {
    public static final class drawable {
        public static final int profile = 2131165290;
    }
}

R.drawable.xxx는 다음과 같이 android(kotlin)에서 저장할 때, 정수로 저장하기 때문이다.

따라서 R.drawable.profile을 부르면 Int 데이터로 변환돼서 나오는 것이다.

왜 이런 방식을 사용할까?

painterResource() 함수를 보면 다음과 같다.

painterResource(@DrawableRes id: Int)

여기서 @DrawableRes 어노테이션의 경우 해당 객체가 실제로 존재하는지 확인하는 어노테이션이다.

위 어노테이션이 없을 경우, R.drawable.hello와 같이 없는 데이터를 불러와도 컴파일이 되는 문제가 생길 수 있기 때문이다.